package server.controlleurs.partie;

import java.util.ArrayList;

import server.controlleurs.tour.TourControlleur;
import server.models.Equipe;
import server.models.PosteDeTir;
import server.models.participant.Participant;
import server.models.partie.Partie;
import server.models.tireur.Tireur;

public class PartieControlleur implements IPartieControlleur {

	private static final String NOM_PREMIERE_EQUIPE = "Équipe Bleu";
	private static final String NOM_DEUXIEME_EQUIPE = "Équipe Rouge";

	private TourControlleur tourControlleur = null;

	private Partie partie;
	private ArrayList<Participant> listeParticipants = new ArrayList<Participant>();

	public PartieControlleur()
	{
		this.partie = new Partie();
		this.initialiserEquipes();
		this.initialiserPostesDeTir();
		this.tourControlleur = new TourControlleur(partie.getTerrain(), partie.getListeEquipes());
	}

	//Getters et setters
	public Partie getPartie() {
		return this.partie;
	}

	/**
	 * Joindre un participant à la partie
	 * @param participant
	 * @throws Exception
	 */
	public void joindreParticipant(Participant participant) throws Exception {
		if (this.listeParticipants.size() < 4) {
			this.listeParticipants.add(participant);

			if (this.listeParticipants.size() == 4) {				

				this.demandeEquipeAuParticipants();
				this.debuterPartie();
			}
		} else {
			throw new Exception("Il y a déjà 4 participants dans la partie");
		}
	}

	private void demandeEquipeAuParticipants() {
		for (Participant part : listeParticipants)
		{
			Equipe equipeChoisie;
			equipeChoisie = part.getClient().choisirEquipe(this.partie.getListeEquipes());
			ajouterJoueurAEquipe(equipeChoisie, part);
		}
	}

	private void debuterPartie() {
		this.tourControlleur.jouerTour();
		
		Equipe equipe1 = this.partie.getListeEquipes().get(0);
		Equipe equipe2 = this.partie.getListeEquipes().get(1);
		
		for (Tireur tireur : equipe1.getTireurs()) {
			boolean gagner = equipe2.getScore() < equipe1.getScore();
			tireur.getParticipant().getClient().afficherGagnant(gagner);
		}
		
		for (Tireur tireur : equipe2.getTireurs()) {
			boolean gagner = equipe1.getScore() < equipe2.getScore();
			tireur.getParticipant().getClient().afficherGagnant(gagner);
		}
		
	}

	public void ajouterJoueurAEquipe(Equipe equipe, Participant participant)
	{
		Tireur tireur = new Tireur(participant, this.partie.getTerrain().getListePostesDeTir());

		equipe.ajouterTireur(tireur);
	}

	/**
	 * Initialiser les équipes
	 */
	private void initialiserEquipes() {
		this.partie.ajouterEquipe(new Equipe(NOM_PREMIERE_EQUIPE));
		this.partie.ajouterEquipe(new Equipe(NOM_DEUXIEME_EQUIPE));
	}

	/**
	 * Initialiser les postes de tir
	 */
	private void initialiserPostesDeTir() {
		//Initialise 8 postes de tir, numéroté de 1 à 8.
		for (int i = 0; i < 8; i++) {
			this.partie.getTerrain().ajouterPosteDeTir(new PosteDeTir(i + 1));
		}
	}
}
